#include <bits/stdc++.h>
using namespace std;
const int maxn = 300000 + 5;
const int MOD = (int)1e9 + 7;
using LL = long long;
double k[maxn]; // 存储所有直线的斜率

int main() {
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    int a, b, c;
    cin >> a >> b >> c;
    double xielv = b ? (-1.0 * a / b) : 1e17;
    k[i] = xielv;
  }
  sort(k + 1, k + n + 1);
  int L = 1, R = 1;
  LL ans = 0;
  for (int i = 1; i <= n; i++) {
    while (k[L] < k[i])
      L++; // 最终L一定是在第一个斜率等于 k[i]的位置。
    while (R <= n && k[R] <= k[i])
      R++; // 最终R一定是在第一个斜率> k[i]的位置。
    int x = L - 1;
    int y = n + 1 - R;
    ans = (ans + 1LL * x * y % MOD) % MOD;
  }
  cout << ans;

  return 0;
}